home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Mania 5
/
MacMania 5.toast
/
/
Internet software
/
NewsWatcher
/
NW Source
/
Source
/
aevt.c
< prev
next >
Wrap
Text File
|
1997-01-09
|
13KB
|
471 lines
/*----------------------------------------------------------------------------
aevt.c
This module handles Apple events.
Copyright © 1994-1997, Northwestern University.
----------------------------------------------------------------------------*/
#include <stdio.h>
#include "glob.h"
#include "aevt.h"
#include "dialog.h"
#include "newsrc.h"
#include "memutil.h"
#include "message.h"
#include "group.h"
#include "newswatcher.h"
#include "status.h"
#include "full.h"
#include "subscribe.h"
#include "print.h"
#include "windutil.h"
#include "wind.h"
#include "url.h"
#define kInitialGroupsResId 200 /* STR# resource id of intial group list
customization resource */
#define kOpenPrefsFileDlg 156
#define kOpenPrefsFileDlgQuitItem 1
static AppleEvent *gFirstEvent;
static AppleEvent *gFirstReply;
static AEEventHandlerUPP gHandleOAPPUPP;
static AEEventHandlerUPP gHandleODOCUPP;
static AEEventHandlerUPP gHandlePDOCUPP;
static AEEventHandlerUPP gHandleQUITUPP;
static AEEventHandlerUPP gHandleGURLUPP;
static AEEventHandlerUPP gHandleFirstEventUPP;
/*----------------------------------------------------------------------------
MyGotRequiredParams
Check for unexpected required parameters. See NIM:IAC 4-35.
Entry: event = pointer to event.
Exit: function result = error code (errAEParamMissed if unexpected
required parameter).
----------------------------------------------------------------------------*/
static OSErr MyGotRequiredParams (AppleEvent *event)
{
OSErr err = noErr;
DescType returnedType;
Size actualSize;
err = AEGetAttributePtr(event, keyMissedKeywordAttr, typeWildCard,
&returnedType, nil, 0, &actualSize);
return err == errAEDescNotFound ? noErr : errAEParamMissed;
}
/*----------------------------------------------------------------------------
HandleOAPP
Handle the open application event.
----------------------------------------------------------------------------*/
static pascal OSErr HandleOAPP (AppleEvent *event, AppleEvent *reply, long refcon)
{
WindowPtr wind;
OSErr err = noErr;
Boolean addingInitialSubscribedGroupsStatusMesageDisplayed = false;
short i;
Str255 groupName;
long nameOffset;
err = MyGotRequiredParams(event);
if (err != noErr) goto exit;
if (gStartingUp) {
if (gPrefs.autoFetchNewsrc) return noErr;
err = MakeNewUntitledUserGroupWindow(&wind);
if (err != noErr) goto exit;
SendBehind(wind, nil);
if (!gPrefsFileFoundAtStartup) {
i = 1;
while (true) {
*groupName = 0;
GetIndString(groupName, kInitialGroupsResId, i);
if (*groupName == 0) break;
if (!addingInitialSubscribedGroupsStatusMesageDisplayed) {
err = DisplayStatusMessageNumber(kStrAddingInitialSubscribedGroups);
if (err != noErr) goto exit;
addingInitialSubscribedGroupsStatusMesageDisplayed = true;
}
p2cstr(groupName);
nameOffset = FindGroupOffset((char*)groupName);
if (nameOffset != -1) {
err = AddNewGroup(nameOffset, wind, kMaxLong, nil, false);
if (err != noErr) goto exit;
}
i++;
}
err = DoZoom(wind, inZoomOut);
if (err != noErr) goto exit;
}
return noErr;
} else {
if (!gStartupOK) return userCanceledErr;
return MakeNewUntitledUserGroupWindow(&wind);
}
exit:
ReportSystemError(err);
return err;
}
/*----------------------------------------------------------------------------
HandleODOC
Handle the open document event.
----------------------------------------------------------------------------*/
static pascal OSErr HandleODOC (AppleEvent *event, AppleEvent *reply, long refcon)
{
OSErr err = noErr;
AEDescList docList = {0, nil};
long numItems, i;
AEKeyword keywd;
DescType returnedType;
Size actualSize;
FSSpec fSpec;
FInfo fndrInfo;
DialogPtr dlg;
short item;
WindowPtr wind;
if (!gStartupOK) return userCanceledErr;
err = AEGetParamDesc(event, keyDirectObject, typeAEList, &docList);
if (err != noErr) goto exit;
err = MyGotRequiredParams(event);
if (err != noErr) goto exit;
err = AECountItems(&docList, &numItems);
if (err != noErr) goto exit;
for (i = 1; i <= numItems; i++) {
err = AEGetNthPtr(&docList, i, typeFSS, &keywd, &returnedType,
(Ptr)&fSpec, sizeof(fSpec), &actualSize);
if (err != noErr) goto exit;
err = FSpGetFInfo(&fSpec, &fndrInfo);
if (err != noErr) goto exit;
if (fndrInfo.fdType == kPrefsFileType && !gStartingUp) goto exit1;
if (fndrInfo.fdType == kSavedUserGroupListFileType) {
err = OpenUserGroupListFile(&fSpec);
} else if (fndrInfo.fdType == kSavedMessageFileType) {
err = OpenMessageFile(&fSpec, &wind);
}
if (err != noErr) goto exit;
}
err = AEDisposeDesc(&docList);
if (err != noErr) goto exit;
return noErr;
exit:
if (docList.dataHandle != nil) AEDisposeDesc(&docList);
ReportSystemError(err);
return err;
exit1:
if (docList.dataHandle != nil) AEDisposeDesc(&docList);
err = MyGetNewDialog(kOpenPrefsFileDlg, kOpenPrefsFileDlgQuitItem, cancel, &dlg);
if (err != noErr) return err;
SysBeep(0);
MyModalDialog(dlg, gDialogFilterUPP, &item);
err = DoClose(dlg);
if (err != noErr) return err;
if (item == kOpenPrefsFileDlgQuitItem) gDone = true;
return userCanceledErr;
}
/*----------------------------------------------------------------------------
HandlePDOC
Handle the print document event.
----------------------------------------------------------------------------*/
static pascal OSErr HandlePDOC (AppleEvent *event, AppleEvent *reply, long refcon)
{
OSErr err = noErr;
AEDescList docList = {0, nil};
long numItems, i;
AEKeyword keywd;
DescType returnedType;
Size actualSize;
FSSpec fSpec;
FInfo fndrInfo;
WindowPtr wind;
TWindow **info;
TEHandle theTE;
Handle text;
CStr255 title;
long start, end;
Boolean firstFile = true;
if (!gStartupOK) return userCanceledErr;
wind = MyFrontWindow();
if (GetMyWindowKind(wind) == kStatus) DoClose(wind);
err = AEGetParamDesc(event, keyDirectObject, typeAEList, &docList);
if (err != noErr) goto exit;
err = MyGotRequiredParams(event);
if (err != noErr) goto exit;
err = AECountItems(&docList, &numItems);
if (err != noErr) goto exit;
for (i = 1; i <= numItems; i++) {
err = AEGetNthPtr(&docList, i, typeFSS, &keywd, &returnedType,
(Ptr)&fSpec, sizeof(fSpec), &actualSize);
if (err != noErr) goto exit;
err = FSpGetFInfo(&fSpec, &fndrInfo);
if (err != noErr) goto exit;
if (fndrInfo.fdType == kSavedMessageFileType) {
err = OpenMessageFile(&fSpec, &wind);
if (err != noErr) goto exit;
HandleUpdate(wind);
if (firstFile) {
err = StartPrint();
if (err != noErr) goto exit;
err = DisplayStatusMessageNumber(kStrPrinting);
if (err != noErr) goto exit;
firstFile = false;
}
GetWTitle(wind, (StringPtr)title);
p2cstr((StringPtr)title);
info = (TWindow**)GetWRefCon(wind);
theTE = (**info).theTE;
text = (**theTE).hText;
start = 0;
end = MyGetHandleSize(text);
err = PrintText(text, start, end, title);
if (err != noErr) goto exit;
err = DoClose(wind);
if (err != noErr) goto exit;
}
}
err = AEDisposeDesc(&docList);
if (err != noErr) goto exit;
return noErr;
exit:
if (docList.dataHandle != nil) AEDisposeDesc(&docList);
ReportSystemError(err);
return err;
}
/*----------------------------------------------------------------------------
HandleQUIT
Handle the quit application event.
----------------------------------------------------------------------------*/
static pascal OSErr HandleQUIT (AppleEvent *event, AppleEvent *reply, long refcon)
{
OSErr err = noErr;
err = MyGotRequiredParams(event);
if (err != noErr) return err;
gDone = true;
return noErr;
}
/*----------------------------------------------------------------------------
HandleGURL
Handle the get url event.
----------------------------------------------------------------------------*/
static pascal OSErr HandleGURL (AppleEvent *event, AppleEvent *reply, long refcon)
{
CStr255 url;
DescType typeCode;
Size actualSize;
OSErr err = noErr;
OSErr result = noErr;
if (!gStartupOK) return userCanceledErr;
err = AEGetParamPtr(event, keyDirectObject, typeChar, &typeCode, url,
255, &actualSize);
if (err != noErr) return err;
err = MyGotRequiredParams(event);
if (err != noErr) return err;
url[actualSize] = 0;
result = OpenURLString(url);
if (reply->dataHandle != nil) {
err = AEPutParamPtr(reply, keyDirectObject, typeShortInteger,
&result, sizeof(result));
if (err != noErr) return err;
} else {
switch (result) {
case paramErr:
ErrorMessageNumber(kStrURLSyntaxError);
break;
case fnfErr:
NoteMessageNumber(kStrArticleOrGroupNotFound);
break;
default:
ReportSystemError(result);
break;
}
}
return noErr;
}
/*----------------------------------------------------------------------------
HandleFirstEvent
Handle the first event.
----------------------------------------------------------------------------*/
static pascal OSErr HandleFirstEvent (AppleEvent *event, AppleEvent *reply, long refcon)
{
*gFirstEvent = *event;
*gFirstReply = *reply;
return AESuspendTheCurrentEvent(event);
}
/*----------------------------------------------------------------------------
InitializeAppleEvents
Initialize Apple events. Get the first event and suspend it. The caller
must resume this first event to actually process it when initialization
is complete.
Exit: funtion result = error code.
firstEvent = event record for first event.
firstReply = reply record for first event.
----------------------------------------------------------------------------*/
OSErr InitializeAppleEvents (AppleEvent *firstEvent, AppleEvent *firstReply)
{
OSErr err = noErr;
Boolean gotEvt;
EventRecord ev;
gFirstEvent = firstEvent;
gFirstReply = firstReply;
gHandleOAPPUPP = NewAEEventHandlerProc(HandleOAPP);
gHandleODOCUPP = NewAEEventHandlerProc(HandleODOC);
gHandlePDOCUPP = NewAEEventHandlerProc(HandlePDOC);
gHandleQUITUPP = NewAEEventHandlerProc(HandleQUIT);
gHandleGURLUPP = NewAEEventHandlerProc(HandleGURL);
gHandleFirstEventUPP = NewAEEventHandlerProc(HandleFirstEvent);
err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication,
gHandleFirstEventUPP, 0, false);
if (err != noErr) return err;
err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments,
gHandleFirstEventUPP, 0, false);
if (err != noErr) return err;
err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments,
gHandleFirstEventUPP, 0, false);
if (err != noErr) return err;
err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication,
gHandleFirstEventUPP, 0, false);
if (err != noErr) return err;
err = AEInstallEventHandler(kGetURLEventClass, kGetURLEventID,
gHandleFirstEventUPP, 0, false);
if (err != noErr) return err;
while (true) {
gotEvt = WaitNextEvent(highLevelEventMask | activMask | updateMask | osMask,
&ev, GetCaretTime(), nil);
if (gotEvt && ev.what == kHighLevelEvent) {
err = AEProcessAppleEvent(&ev);
if (err != noErr) return err;
break;
}
if (gotEvt) HandleEvent(&ev);
}
err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication,
gHandleOAPPUPP, 0, false);
if (err != noErr) return err;
err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments,
gHandleODOCUPP, 0, false);
if (err != noErr) return err;
err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments,
gHandlePDOCUPP, 0, false);
if (err != noErr) return err;
err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication,
gHandleQUITUPP, 0, false);
if (err != noErr) return err;
err = AEInstallEventHandler(kGetURLEventClass, kGetURLEventID,
gHandleGURLUPP, 0, false);
return err;
}
/*----------------------------------------------------------------------------
MyAEProcessAppleEvent
Process an Apple event.
Entry: ev = pointer to event record.
Exit: funtion result = error code.
----------------------------------------------------------------------------*/
OSErr MyAEProcessAppleEvent (EventRecord *ev)
{
OSErr err = noErr;
gAEServer = true;
err = AEProcessAppleEvent(ev);
gAEServer = false;
return err;
}
/*----------------------------------------------------------------------------
MyAEResumeTheCurrentEvent
Resume processing an Apple event.
Entry: event = pointer to event record.
reply = pointer to reply record.
dispatcher = pointer to event handler.
handlerRefcon = refcon.
Exit: funtion result = error code.
----------------------------------------------------------------------------*/
OSErr MyAEResumeTheCurrentEvent (AppleEvent *event, AppleEvent *reply,
AEEventHandlerUPP dispatcher, long handlerRefCon)
{
OSErr err = noErr;
gAEServer = true;
err = AEResumeTheCurrentEvent(event, reply, dispatcher, handlerRefCon);
gAEServer = false;
return err;
}